home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / boss_sup.zip / WN_GEDAT.C < prev    next >
Text File  |  1991-10-26  |  7KB  |  155 lines

  1. /*
  2. ** The Window BOSS's Data Clerk
  3. ** Copyright (c) 1988 - Philip A. Mongelluzzo
  4. ** All rights reserved.
  5. **
  6. ** wn_gedate - get European date from window with gross validation 
  7. **
  8. ** Copyright (c) 1991 - Philip A. Mongelluzzo
  9. ** All rights reserved.
  10. **
  11. */
  12.  
  13. #include "winboss.h"                    /* standard stuff */
  14.  
  15. /*
  16. *************
  17. * wn_gedate *
  18. *************
  19. */
  20.  
  21. /*
  22. ** wn_gedate(fun,frm,fld,wn,row,col,prmpt,atrib,fill,day,month,year,ubuff,hlpmsg,errmsg)
  23. **
  24. **    int        fun - fucntion code (SET || XEQ)
  25. **    (WIFORM)   frm - form pointer  (actual || NFRM)
  26. **    int        fld - field # in form (actual || NULL)
  27. **    (WINDOWPTR) wn - window pointer
  28. **    int        row - row in window where data input begins
  29. **    int        col - col in window where data input begins
  30. **    (char *) prmpt - field promt (call with NSTR for none)
  31. **    unsigned atrib - field (not prompt) atributes 
  32. **    char      fill - field fill character
  33. **    (int *)    day - pointer to int for day (1-31)
  34. **    (int *)  month - pointer to int for month (1-12)
  35. **    (int *)   year - pointer to int for year (0-99)
  36. **    (char *) ubuff - pointer to char array of 10 bytes for editing 
  37. **    (char *)hlpmsg - pointer to help message (call with NSTR for none)
  38. **    (char *)errmsg - pointer to err message (call with NSTR) for none)
  39. **
  40. ** RETURNS:
  41. **
  42. **    DAY, MONTH, and YEAR via pointers - European Format
  43. **
  44. **    NULL if error, else the non zero value returned from wn_input.
  45. **
  46. ** NOTES:
  47. **
  48. **  FUN -   fun can only be SET for form setup, or XEQ for immediate
  49. **          execution.  When called with SET, valid arguements for both
  50. **          "frm" and "fld" must be specfied.  frm is the field pointer
  51. **          returned from frmopn(), and fld is the field sequence number
  52. **          in the form for this field.  When called with XEQ frm must
  53. **          be NFRM and fld must NULL.
  54. **
  55. **  UBUFF - Editing buffer.  Must be of sufficent size to hold the
  56. **          data as it is entered.  Typical value is the length
  57. **          of the mask + 2 bytes (strlen(mask)+2).
  58. **
  59. **          On entry, the first byte of ubuff should be 
  60. **          a null, otherwise wn_input assumes there is valid
  61. **          data there and will enter edit mode.  This can be 
  62. **          handy if there is a need for prefilled but editable
  63. **          fields.  In actual pratice, wn_input uses this
  64. **          buffer for both initial character data entry and
  65. **          subsequent editing.
  66. **
  67. **          On return, ubuff contains the actual data entered in
  68. **          character format with fill and mask characters as
  69. **          spaces (e.g. "12 12 88").
  70. **
  71. **  Only basic reasonability checks are made.  Month: 1-12, Day: 1-32...
  72. **
  73. **  Calls wn_input to perform data entry.
  74. **
  75. **  Data must satisfy validation checks for function to return.
  76. */
  77.  
  78. wn_gedate(fun,frm,fld,wn,row,col,prmpt,atrib,fill,day,month,year,ubuff,hlpmsg,errmsg)
  79. int fun;                                /* SET or XEQ */
  80. WIFORM frm;                             /* form pointer or NFRM */
  81. int fld;                                /* field number or NULL */
  82. WINDOWPTR wn;                           /* window to use */
  83. int row, col;                           /* position of input field */
  84. char *prmpt;                            /* prompt string */
  85. unsigned atrib;                         /* data entry atribute */
  86. char fill;                              /* fill char */
  87. int *month, *day, *year;                /* ints of month,day,year */
  88. char *ubuff;                            /* returns "mm/dd/yy" */
  89. char *hlpmsg,*errmsg;                   /* help and error messages */
  90. {
  91. int m, d, y;                            /* month day & year */
  92. char mbuf[10];                          /* local buffer */
  93. char *p;                                /* scratch */
  94. unsigned int r;                         /* sscanf return value */
  95. int rv;                                 /* return value */
  96. int eflg;                               /* error flag */
  97.  
  98.   if(fun != SET && fun != XEQ)          /* saftey check */
  99.     return(NULL);
  100.  
  101.   if(fun == SET) {                      /* set up */
  102.     if(frm[fld]->pself != (char *)frm[fld])
  103.       wns_ierr("wn_gdate");             /* die if memory is mangled */
  104.     frm[fld]->wn = wn;                  /* set window */
  105.     frm[fld]->row = row;                /* set row */
  106.     frm[fld]->col = col;                /* set col */
  107.     frm[fld]->prmpt = prmpt;            /* set prompt */
  108.     frm[fld]->atrib = atrib;            /* set attribute */
  109.     frm[fld]->fill = fill;              /* set fill character */
  110.     frm[fld]->fcode = GDATE;            /* function code */
  111.     frm[fld]->v1.vip = day;             /* &day */
  112.     frm[fld]->v2.vip = month;           /* &month */
  113.     frm[fld]->v3.vip = year;            /* &year */
  114.     frm[fld]->v4.vcp = ubuff;           /* &ubuff */
  115.     frm[fld]->v5.vcp = hlpmsg;          /* &hlpmsg */
  116.     frm[fld]->v6.vcp = errmsg;          /* &errmsg */
  117.     return(TRUE);
  118.   }
  119.  
  120. begin:
  121.   if(!(rv=wn_input(wn,row,col,prmpt,"##/##/##",fill,atrib,ubuff,hlpmsg))) {
  122.     *ubuff = NUL;                       /* load ubuff with a bad date */
  123.     return(NULL);                       /* indicate error */
  124.   }
  125.   if(wni_frmflg) return(TRUE);          /* wn_frmget in progress */
  126.   if(wns_escape) return(rv);            /* escape pressed ?? */
  127.   strcpy(mbuf,ubuff);                   /* load my buffer */
  128.   p = mbuf;                             /* set pointer */
  129.   while (*p) {                          /* set up to pluck */
  130.     if(*p == '/')                       /* the slash */
  131.       *p = ' ';                         /* and stash a space */
  132.     p++;                                /* bump pointer */
  133.   }                                     /* continue till done */
  134.   r =  sscanf(mbuf, "%02d %02d %02d", &d, &m, &y);
  135.   if(r == EOF || r == 0) {              /* no data - set to zip */
  136.     *month = *day = *year = 0;          /* set to zip */
  137.     return(rv);                         /* and return */
  138.   }
  139.   eflg = FALSE;
  140.   if(r != 3) eflg = TRUE;               /* not enuf data */
  141.   if(m < 1 || m > 12) eflg = TRUE;      /* bad month */
  142.   if(d < 1 || d > 31) eflg = TRUE;      /* bad day */
  143.   if(y < 0 || y > 99) eflg = TRUE;      /* bad year */
  144.   if(eflg) {
  145.     wn_iemsg(errmsg);                   /* do error thing */
  146.     goto begin;                         /* and start over */
  147.   }
  148.   *month = m;                           /* load user month */
  149.   *day = d;                             /* and day */
  150.   *year = y;                            /* and year */
  151.   return(rv);                           /* all is well.. in gross sense */
  152. }
  153.  
  154. /* End */
  155.